package com.alibaba.citrus.ots.price.repository;

import com.alibaba.lattice2.epoch.sdk.model.Result;
import com.epoch.app.otspricecenter.dto.request.PageQueryPriceRequest;
import com.epoch.app.otspricecenter.model.dto.PageQueryPriceResponse;
import com.epoch.app.otspricecenter.model.dto.PriceCategorySDO;
import com.epoch.app.otspricecenter.model.dto.RegularPriceRequest;
import com.epoch.app.otspricecenter.model.dto.RegularPriceResponse;
import com.epoch.app.otspricecenter.sdo.PriceDimensionConfigSDO;
import com.epoch.app.otspricecenter.sdo.PriceDimensionSDO;
import com.epoch.app.otspricecenter.sdo.PriceRecordSDO;
import com.epoch.app.otspricecenter.sdo.PriceTypeSDO;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface PriceQueryRepository {


    /**
     * 查询价格类型和维度目录树
     * @return
     */
    Result<Map<String, List<PriceCategorySDO>>> getTypeAndDimensionTree();


    /**
     * 分页查询价格列表
     */
    Result<List<PageQueryPriceResponse>> queryPricePageList(PageQueryPriceRequest pageQueryPriceRequest);

    /**
     * 查询价格类型
     *
     * @param priceTypeId
     * @return
     */
    Result<PriceTypeSDO> queryPriceType(String priceTypeId);

    /**
     * 查询价格存储记录
     *
     * @param recordId
     * @return
     */
    Result<PriceRecordSDO> queryPriceRecord(String recordId);


    /**
     * 批量查询维度规则
     *
     * @param dimensionIds
     * @return
     */
    Result<List<PriceDimensionSDO>> batchQueryDimensionRule(List<String> dimensionIds);

    /**
     * 根据 md5字符串列表，批量查询维度配置数据
     *
     * @param md5List
     * @param useDate
     * @return 价格维度配置数据
     */
    Result<List<PriceDimensionConfigSDO>> batchQueryDimensionConfig(List<String> md5List, Date useDate);

    /**
     * 创建价格维度规则实体
     * @param dimensionId
     * @return
     */
    Result<PriceDimensionSDO> queryPriceDimension(String dimensionId);

    /**
     * 通过表名 查询价格维度实体
     * @param tableName
     * @return
     */
    Result<PriceDimensionSDO> queryPriceDimensionByTableName(String tableName);

    /**
     * 根据表名批量查询维度信息
     * @param tableNames
     * @return
     */
    Result<List<PriceDimensionSDO>> batchPriceDimension(List<String> tableNames);


    /**
     * 根据 md5, 属性组编码、维度 ID， 价格类型进行唯一确认, 查询价格维度配置
     * @param priceDimensionConfigSDO 根据 md5, 属性组编码、维度 ID， 价格类型进行唯一确认
     * @return
     */
    PriceDimensionConfigSDO queryPriceDimensionConfig(PriceDimensionConfigSDO priceDimensionConfigSDO);


    PriceDimensionConfigSDO loadById(Long id);

    Result<List<PageQueryPriceResponse>> queryPricePageListFromES(PageQueryPriceRequest pageQueryPriceRequest);

    /**
     * 批量查询维度数据
     * @param dimensionIds
     * @return
     */
    List<PriceDimensionSDO> queryPriceDimensionList(List<String> dimensionIds);

    /**
     * 查询常规价列表
     * @param regularPriceRequest
     * @return
     */
    Result<List<RegularPriceResponse>> loadRegularPriceList(RegularPriceRequest regularPriceRequest);
}
